#!/bin/bash

function is_latest_stable_tag() {
  [ "$(latest_stable_tag)" == "${CI_COMMIT_TAG}" ]
}

function is_latest_tag() {
  [ "$(latest_tag)" == "${CI_COMMIT_TAG}" ]
}

function latest_tag() {
  git -c versionsort.prereleaseSuffix=rc tag --sort=-v:refname | head -1
}

function latest_stable_tag() {
  git -c versionsort.prereleaseSuffix=rc tag --sort=-v:refname | awk '!/rc/' | head -1
}

if [[ "${CI_PROJECT_NAME}" == "gitlabhq" || "${CI_PROJECT_NAME}" == "gitlab-foss" || "${FOSS_ONLY}" == "1" ]]; then
  QA_IMAGE_NAME="gitlab-ce-qa"
  QA_BUILD_TARGET="foss"
# Build QA Image for JH project
elif [[ "${CI_PROJECT_PATH}" =~ ^gitlab-(jh|cn)\/.*$ || "${CI_PROJECT_NAME}" =~ ^gitlab-jh ]]; then
  QA_IMAGE_NAME="gitlab-jh-qa"
  QA_BUILD_TARGET="jhqa"
else
  QA_IMAGE_NAME="gitlab-ee-qa"
  QA_BUILD_TARGET="ee"
fi

# Tag with commit SHA by default
QA_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/${QA_IMAGE_NAME}:${CI_COMMIT_SHA}"

# For branches, tag with slugified branch name. For tags, use the tag directly
# with v prefix removed
IMAGE_TAG=${CI_COMMIT_TAG#v}
IMAGE_TAG=${IMAGE_TAG:-$CI_COMMIT_REF_SLUG}

QA_IMAGE_BRANCH="${CI_REGISTRY}/${CI_PROJECT_PATH}/${QA_IMAGE_NAME}:${IMAGE_TAG}"
QA_IMAGE_MASTER="${CI_REGISTRY}/${CI_PROJECT_PATH}/${QA_IMAGE_NAME}:master"

DESTINATIONS="--tag ${QA_IMAGE} --tag ${QA_IMAGE_BRANCH}"

# Auto-deploy tag format uses first 12 letters of commit SHA. Tag with that
# reference also for EE images.
if [ "${QA_IMAGE_NAME}" == "gitlab-ee-qa" ]; then
  QA_IMAGE_FOR_AUTO_DEPLOY="${CI_REGISTRY}/${CI_PROJECT_PATH}/${QA_IMAGE_NAME}:${CI_COMMIT_SHA:0:11}"
  DESTINATIONS="${DESTINATIONS} --tag $QA_IMAGE_FOR_AUTO_DEPLOY"
fi

# On tag pipelines in Canonical projects (gitlab and gitlab-foss), release to
# Dockerhub also
if [ -n "${CI_COMMIT_TAG}" ] && [ "${CI_PROJECT_NAMESPACE}" == "gitlab-org" ]; then
  # Temporarily control release to Dockerhub, until we confirm it works in a
  # release and finally drops the release job from omnibus-gitlab pipeline.
  if [ "${RELEASE_QA_IMAGE_TO_DOCKERHUB}" == "true" ]; then
    echo "$DOCKERHUB_PASSWORD" | docker login "docker.io" -u "$DOCKERHUB_USERNAME" --password-stdin

    DOCKERHUB_TAG_IMAGE="gitlab/${QA_IMAGE_NAME}:${IMAGE_TAG}"
    DESTINATIONS="${DESTINATIONS} --tag ${DOCKERHUB_TAG_IMAGE}"

    # If we are on latest tag (RC or stable), tag the image as RC
    if is_latest_tag; then
      DESTINATIONS="${DESTINATIONS} --tag gitlab/${QA_IMAGE_NAME}:rc"
    fi

    # If we are on latest stable tag, tag the image as latest
    if is_latest_stable_tag; then
      DESTINATIONS="${DESTINATIONS} --tag gitlab/${QA_IMAGE_NAME}:latest"
    fi
  else
    echo "RELEASE_QA_IMAGE_TO_DOCKERHUB not set to true. Not releasing to Dockerhub."
  fi
fi

echo "Building QA image for '${QA_BUILD_TARGET}' for destinations: ${DESTINATIONS}"

if [ "${QA_IMAGE_BUILD_DRY_RUN}" == "true" ]; then
  exit 0
fi

docker buildx build \
  --cache-to=type=inline \
  --cache-from="$QA_IMAGE_BRANCH" \
  --cache-from="$QA_IMAGE_MASTER" \
  --platform=${ARCH:-amd64} \
  --build-arg=CHROME_VERSION="${CHROME_VERSION}" \
  --build-arg=DOCKER_VERSION="${DOCKER_VERSION}" \
  --build-arg=RUBY_VERSION="${RUBY_VERSION}" \
  --build-arg=QA_BUILD_TARGET="${QA_BUILD_TARGET}" \
  --file="${CI_PROJECT_DIR}/qa/Dockerfile" \
  --push \
  ${DESTINATIONS} \
  ${CI_PROJECT_DIR}
